package com.xxxtea.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.servlet.ServletUtil;
import com.xxxtea.common.Result;
import com.xxxtea.mpe.helper.ResourceHelper;
import com.xxxtea.mpe.model.Attachment;
import com.xxxtea.util.FileHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

/**
 * 文件管理控制器
 * 
 * 提供文件上传和下载功能，包括：
 * - 文件上传（支持多种文件格式）
 * - 文件下载
 * 
 * 文件上传后会生成唯一的文件名，并返回文件访问URL
 * 
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("文件接口")
@RestController
@RequestMapping("/file")
public class FileController {

	/**
	 * 文件存储目录
	 * 从配置文件中读取
	 */
	@Value("${fileDir}")
	private File fileDir;

	/**
	 * 上传文件
	 * 将上传的文件保存到指定目录，并生成唯一的文件名
	 * 
	 * @param file 上传的文件
	 * @return 文件附件信息
	 * @throws IOException 文件操作异常
	 */
	@ApiOperation("上传文件")
	@PostMapping("/upload")
	public Result<Attachment> upload(MultipartFile file) throws IOException {
		// 获取原始文件名
		String originalFilename = file.getOriginalFilename();
		// 生成唯一的文件名
		String filename = FileHelper.createUUID(originalFilename);
		// 设置保存路径
		File saveFile = new File(fileDir, filename);
		// 将文件保存到指定目录
		file.transferTo(saveFile);
		System.out.println(saveFile.getAbsolutePath());
		
		// 创建附件对象
		Attachment attachment = new Attachment();
		attachment.setName(originalFilename);
		attachment.setFilename(filename);
		attachment.setUrl(ResourceHelper.wrap(filename));
		
		// 记录上传日志
		log.info("上传成功!文件名: {}, 文件大小: {}", filename, FileUtil.readableFileSize(file.getSize()));
		return Result.success(attachment);
	}

	/**
	 * 下载文件
	 * 根据文件名从存储目录下载文件
	 * 
	 * @param filename 文件名
	 * @param response HTTP响应对象
	 */
	@ApiOperation("下载文件")
	@PostMapping("/download/{filename}")
	public void download(@PathVariable String filename, HttpServletResponse response) {
		// 将文件写入HTTP响应流
		ServletUtil.write(response, new File(fileDir, filename));
	}
}
